package com.tanhua.dubbo.server.service;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tanhua.common.mapper.UserReportMapper;
import com.tanhua.common.pojo.UserReport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 *
 * @ClassName: UserReportService
 * @Author:王晨晗
 * @Description: 用户报告业务层
 * @Date: 2022/01/10/15:30
 */
@Service
public class UserReportService {
    @Autowired
    private UserReportMapper userReportMapper;

    /**
     * @description 根据报告id 查询用户的报告
     * @param reportId
     * @return
     */
    public UserReport findByReportId(Long reportId) {
        //执行查询,获取到指定的报告信息
        UserReport userReport = userReportMapper.selectById(reportId);
        //返回报告信息;
        return userReport;
    }

    /**
     * @description 保存报告信息
     * @param userReport
     * @return
     */
    public boolean save(UserReport userReport){
        //执行保存操作,返回保存结果
        return userReportMapper.insert(userReport) > 0;
    }

    /**
     * @description 根据结果id 获取相同结果的用户 , 因为可能会存在大量用户, 那么我们就做分页处理,获取前50位用户
     *              并且要保证用户的报告时间是近期的,不能是几年前太久远的测试,保证按时间对其排序
     * @param resultId      结果id
     * @param userId        用户id
     * @return
     */
    public List<Object> getUserIdByResultId(Long resultId , Long userId){
        //创建日历对象
        Calendar calendar = Calendar.getInstance();
        //设置三天前的日期时间
        calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH )- 3,0,0,0);
        //获取三天前日期对象
        Date date = calendar.getTime();
        //构建查询条件
        QueryWrapper<UserReport> queryWrapper = new QueryWrapper();
        //构建分页条件
        IPage page = new Page(0 , 50);
        //构建查找条件
        queryWrapper.eq("result_id",resultId).ge("created" , date).ne("user_id" , userId);
        //执行查询,获取分页对象
        IPage selectPage = userReportMapper.selectPage(page, queryWrapper);
        //获取报告结果
        List userReports = selectPage.getRecords();
        //得到结果中的用户id并返回
        return CollUtil.getFieldValues(userReports , "userId");
    }

    /**
     * @description 根据用户id和问卷id获取用户当前问卷的最新报告;
     * @param userId
     * @return
     */
    public UserReport getUserReportByUserId(Long userId , Long questionnaireId){
        //创建查询对象
        QueryWrapper<UserReport> wrapper = new QueryWrapper<>();
        //构建查询条件: 按时间降序排列,取第一位;
        wrapper.eq("user_id" , userId).eq("questionnaire_id"  , questionnaireId ).orderByDesc("created").last("limit 1");
        //执行查询
        UserReport userReport = userReportMapper.selectOne(wrapper);
        //返回结果
        return userReport;
    }
}
